<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    /* 
      请封装一个函数,可以按照一下调用方式进行求和
      - add(1,2,3)
        - add(1,2)(3)
        - add(1)(2,3)
        - add(1)(2)(3)
        - add(1,2)(2,2)(3,2)....
    */

    // 函数中返回函数  实现多次传参

    // 告诉怎么调用的.先声明add
    // ...arg获取函数的全部参数
    function add(...arg) {
      //每次调用函数求和时的初始值不同,为上次的和,声明变量使用
      let num = 0;
      // 当开始调用add的时候,首先把第一次传入的参数和求出来
      // 初始的一个值  
      num = arg.reduce((p, c) => p + c, 0);
      // 返回一个函数 接着调用
      const temp = (...arg) => {
        num = arg.reduce((p, c) => p + c, num)
        return temp
      }

      // 重写temp函数的toString方法,当返回的这个函数转字符串的时候,会隐式转换调用自身的toString方法
        temp.toString=function(){
          return  num
        }


      // 返回一个函数才能接着传参调用
      return temp
    }

    // 当函数执行完成被alert调用的时候,会默认调用自身的toString方法,
    // 最终返回值还是个函数,弹出来也是函数,所以重写temp函数的toString方法,把返回值修改为数字的总和
    alert(add(1, 2, 3))
    // alert(add(1, 2)(3))
    // alert(add(1)(2)(3))
    // alert(add(1, 2)(2, 2)(3, 2))

    // alert 一定打印的是字符串
  </script>
</body>

</html>